# -*- coding:utf-8 -*-
#decorator就是一个返回函数的高阶函数。所以，我们要定义一个能打印日志的decorator
import functools


def log(func):
    @functools.wraps(func)
    def wrapper(*args,**kw):
        print('call %s();' % func.__name__)
        return func(*args,**kw)
    return wrapper

#借助Python的@语法，把decorator置于函数的定义处：
@log
def now():
    print('2015-03-12')

now()
print(now.__name__)

print('-------------------')

def logg(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args,**kw):
            print('%s %s ;' % (text,func.__name__))
            return func(*args,**kw)
        return wrapper
    return decorator

@logg('execute')
def noww():
    print('2018-03-22')

noww()
print (noww.__name__)

print("===================")
#test
#请设计一个decorator，它可作用于任何函数上，并打印该函数的执行时间：
import time
def metric(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kw):
        beginTime = time.time();
        mfun = fn(*args, **kw)
        print('%s executed in %s ms' % (fn.__name__, time.time() - beginTime));
        return mfun;
    return wrapper;



# 测试
@metric
def fast(x, y):
    time.sleep(0.0012)
    return x + y

@metric
def slow(x, y, z):
    time.sleep(0.1234)
    return x * y * z

f = fast(11, 22)
s = slow(11, 22, 33)
if f != 33:
    print('测试失败!')
elif s != 7986:
    print('测试失败!')


